import { createApp, watchEffect } from "vue";
import { useTitle } from "@vueuse/core";
import { defaultStorage, LaunchOptions } from "@sfx-lib/core";
import { setupElementPlus } from "#/common";
import { setupLocales } from "#/locales";
import { setupStores } from "#/stores";

// import { registerAccessDirective } from '@vben/access';
// import { initTippy } from '@vben/common-ui';
// import { preferences } from '@vben/preferences';
// import '@vben/styles';
// import '@vben/styles/ele';

// import { ElLoading } from 'element-plus';

// import { initComponentAdapter } from './adapter/component';
// import { router } from './router';

import App from "../mainApp.vue";

/**
 * 设置应用
 */
export async function setupApp(options: LaunchOptions) {
    // 1. 创建 app
    const app = createApp(App);

    // 处理启动选项
    const { name, workspace } = options;

    // 初始化偏好设置
    // setupPreferences
    // await initPreferences({
    //   workspace,
    //   overrides: overridesPreferences,
    // });

    // 2. 准备
    // 初始化组件适配器
    // setupComponentAdapter
    // await initComponentAdapter();

    // 设置弹窗的默认配置
    // setDefaultModalProps({
    //   fullscreenButton: false,
    // });

    // 设置抽屉的默认配置
    // setDefaultDrawerProps({
    //   zIndex: 2000,
    // });

    // 3. 全局注册
    // 3.1 注册指令 Element Plus提供的v-loading
    // app.directive("loading", ElLoading.directive);
    //

    // 3.2 注册组件
    await setupElementPlus(app, options);

    // app.component('MyComponent', MyComponent)
    // ??
    // 通过 app.component() 和 app.directive() 注册一到多个全局组件或自定义指令。
    // 通过 app.provide() 使一个资源可被注入进整个应用。
    // 向 app.config.globalProperties 中添加一些全局实例属性或方法

    // 4. 国际化 i18n 配置
    await setupLocales(app, options);

    // 5. 配置存储 - ok
    await setupStores(app, options); //

    // 6. 安装权限指令
    // registerAccessDirective(app);

    // 7. 初始化 tippy ?
    // setupX()
    // initTippy(app);

    // 8. 配置路由
    // setupRouters()
    // app.use(router);

    // 9. 动态更新标题
    watchEffect(() => {
        // if (preferences.app.dynamicTitle) {
        // const routeTitle = router.currentRoute.value.meta?.title;
        //     const pageTitle = (routeTitle ? `${$t(routeTitle)} - ` : "") + preferences.app.name;
        // useTitle(pageTitle);
        // }
        useTitle("123");
    });

    return app;
}
